package DAO;

import BD.ExameBD;
import ConexaoBackupBD.ConexaoBD;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;

public class QualificacaoDAO implements ExameInterfaceDAO{
    
    @Override
    public boolean inserir(ExameBD ex) {        
        ConexaoBD conBD = new ConexaoBD(); 
        
        try{
            Connection con = conBD.conectar();
            PreparedStatement pr;
            
            pr = con.prepareStatement("INSERT INTO qualificacao VALUES (?, ?, ?, ?, ?);");
            pr.setInt(1, 0);
            pr.setDate(2, new java.sql.Date(ex.getData().getTime()));
            pr.setInt(3, ex.getCod_banca());
            pr.setInt(4, ex.getCod_tese());
            pr.setString(5, ex.getSituacao());
                
            if(pr.executeUpdate() >0){
                return true;
            }else{
                return false;    
            }
                    
        }catch(SQLException e){
             JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }  
    }
    
    @Override
    public List<ExameBD> filtro(String campo, String valor) {
        ConexaoBD conBD = new ConexaoBD();
        Statement BDQualificacao;
        ResultSet rs;

        List<ExameBD> listaFiltro = new ArrayList<ExameBD>(); 
        try { 
            Connection con = conBD.conectar();
            BDQualificacao = con.createStatement();
            rs = BDQualificacao.executeQuery("SELECT * from qualificacao "
                    + " where "+campo+" like '" + valor + "%' "
                    + " order by(data_qualificacao) ");

            if (rs != null) { 
                while (rs.next()) { 
                    ExameBD qua = new ExameBD();
                    qua.setCodigo(rs.getInt("cod_qualificacao"));
                    qua.setData(rs.getDate("data_qualificacao"));
                    qua.setCod_banca(rs.getInt("cod_banca"));    
                    qua.setCod_tese(rs.getInt("cod_tese"));
                    qua.setSituacao(rs.getString("situacao_qualificacao"));
                    listaFiltro.add(qua); 
                }
                con.close();
                return listaFiltro; 
          }else {
                con.close();
                return null; 
          } 
        } catch (SQLException e) { 
            return null; 
        } 
    }

    @Override
    public boolean excluir(ExameBD ex) {
        ConexaoBD conBD = new ConexaoBD(); 
        String sql = "delete from qualificacao where cod_qualificacao = ?";   

        try {
            Connection con = conBD.conectar();
            PreparedStatement ps = con.prepareStatement(sql);
            ps.setString(1, (String.valueOf(ex.getCodigo())));
            if (ps.executeUpdate() > 0) {
                return true;
            } else {
                return false;
            }
        } catch (SQLException e) {
             JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco", 
             "Erro no banco", JOptionPane.ERROR_MESSAGE);
             return false;
        }
    }
   
    @Override
    public boolean alterar(ExameBD ex) {
        
        ConexaoBD conBD = new ConexaoBD(); 
        
        String sql = "UPDATE qualificacao SET "
                + " data_qualificacao = ?, cod_banca = ? , cod_tese = ?, "
                + " situacao_qualificacao = ? where cod_qualificacao = ?";

        try {
            // obtem conexão
            Connection con = conBD.conectar();
                        
            PreparedStatement ps = con.prepareStatement(sql);

            ps.setDate(1, new java.sql.Date(ex.getData().getTime()));
            ps.setInt(2, ex.getCod_banca());
            ps.setInt(3, ex.getCod_tese());
            ps.setString(4, ex.getSituacao());
            ps.setInt(5, ex.getCodigo());

            if (ps.executeUpdate() > 0) {
                con.close();
                return true;
            } else {
                con.close();
                return false;
            }

        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false;
        }  
    }
    
    
    @Override
    /**Verifica se aluno já esta aprovado em algum exame de qualificação. Se já, retorna false.*/
    public boolean verificarSituacaoParaCadastroExame(int codTese){
        ConexaoBD conBD = new ConexaoBD();
        try { 
            Connection con = conBD.conectar();
            Statement BDQualificacao;
            ResultSet rs;
            
            BDQualificacao = con.createStatement();

            rs = BDQualificacao.executeQuery("SELECT q.situacao_qualificacao FROM tese t, qualificacao q "
                    + " WHERE t.cod_tese = q.cod_tese AND "
                    + " q.cod_tese = "+codTese+" ");
            
            if (rs != null) { 
                while (rs.next()) { 
                    if(rs.getString("q.situacao_qualificacao").equals("Aprovado")){
                        return true;
                    }
                }
                return false; 
            }else {
                return false; 
            } 
        } catch (SQLException e) {
            JOptionPane.showMessageDialog(null,e.getMessage(),
                    "Erro no banco", JOptionPane.ERROR_MESSAGE);
            return false; 
        }    
    }

    @Override
    /**Método para verificar se existe algum exame na mesma situação do qual está sendo alterado ou algo que impossibilite a alteração. 
     Se existe retorna true, caso contrario false. */
    public boolean verificarMesmaSituacaoExame(int codTese, int codExame, String situacao) {
        ConexaoBD conBD = new ConexaoBD();
        
        try {
            Connection con = conBD.conectar();
            Statement BDQualificacao;
            ResultSet rs;
            
            BDQualificacao = con.createStatement();

            rs = BDQualificacao.executeQuery("SELECT q.situacao_qualificacao FROM tese t, qualificacao q "
                    + " WHERE t.cod_tese = q.cod_tese AND "
                    + " q.cod_tese = "+codTese+" AND cod_qualificacao != "+codExame+" ");
            
            if(situacao.equals("Aprovado")){
                if (rs != null) { 
                    while (rs.next()) { 
                        //Se já existir algum exame aprovado ou a ser avaliado, não deixa setar Aprovado
                        if(rs.getString("q.situacao_qualificacao").equals(situacao) 
                                || rs.getString("q.situacao_qualificacao").equals("A ser avaliado")){
                            return true;
                        }
                    }
                    return false; 
                }else {
                    return false; 
                }    
            }else{
                if(situacao.equals("A ser avaliado")){
                    if (rs != null) { 
                        while (rs.next()) { 
                            //Se já existir algum exame a ser avaliado ou aprovado, não deixa setar A ser avaliado
                            if(rs.getString("q.situacao_qualificacao").equals(situacao) 
                                    || rs.getString("q.situacao_qualificacao").equals("Aprovado")){
                                return true;
                            }
                        }
                        return false; 
                    }else {
                        return false; 
                    }     
                }
                else{
                    //Reprovado, deixa alterar
                    return false;
                }
            }
            
        }catch (SQLException e) { 
                JOptionPane.showMessageDialog(null,e.getMessage(), "Erro no banco",
                            JOptionPane.ERROR_MESSAGE);
                return false;      
        }    
    }

    @Override
     /** Método para verificar se pode ser inserido um novo exame de qualificação de acordo
     * com os exames pré cadastrados. Se possuir algum exame de qualificação com a situação 
     * Aprovado ou A ser avaliado, o retorno será false não permitindo uma inserção. */
    public boolean verificarSituacaoAntesDeCadastrar(int codTese) {
        ConexaoBD conBD = new ConexaoBD();
        Statement BDQualificacao;
        ResultSet rs;
               
        Connection con = conBD.conectar();
        try { 
            BDQualificacao = con.createStatement();
            rs = BDQualificacao.executeQuery("SELECT situacao_qualificacao from qualificacao "
                    + " where cod_tese = '"+codTese+"' ");
            
            if(rs!=null){
                while(rs.next()){
                    if(rs.getString("situacao_qualificacao").equals("Aprovado")){
                        JOptionPane.showMessageDialog(null,"Tese do aluno já foi aprovada."
                            + "Não é necessário um novo exame de qualificação.", 
                            "Tese já aprovada",JOptionPane.INFORMATION_MESSAGE);
                        return false; //não permite cadastro de nova qualificação.    
                    }else{
                        if(rs.getString("situacao_qualificacao").equals("A ser avaliado")){
                            JOptionPane.showMessageDialog(null,"Tese do aluno possuí avaliação marcada."
                                + "É necessário definir a situação antes de realizar um novo exame de qualificação.", 
                                "Tese em avaliação",JOptionPane.INFORMATION_MESSAGE);
                            return false; //não permite cadastro de nova qualificação.
                        }
                    }
                }
            }
            con.close();
            return true;
        }catch (SQLException e) { 
                JOptionPane.showMessageDialog(null,e.getMessage(), "Erro no banco",
                            JOptionPane.ERROR_MESSAGE);
                return false;      
        }
    }
}
